/**
*
*/
package com.jivesoftware.addon.example.storage.file.services;
import java.io.InputStream;
import javax.inject.Singleton;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.jivesoftware.addon.example.storage.file.managers.ExternalDocumentIDGenerator;
import com.jivesoftware.addon.example.storage.file.managers.ExternalDocumentVersionIDGenerator;
import com.jivesoftware.addon.example.storage.file.managers.FileStorage;
import com.jivesoftware.addon.example.storage.file.services.resources.FileStorageResponseResourceWrapper;
import com.jivesoftware.addon.example.storage.file.storage.models.ExStorageFileEntity;
import com.jivesoftware.addon.example.storage.file.storage.models.ExStorageFileVersionEntity;
import com.jivesoftware.addon.example.storage.file.storage.models.ExStorageUserEntity;
/**
* @author david.nicholls
*
*/
@Path("/filestorage/workspaces/{workspaceId}/files")
@Singleton
public class FileStorageService {
private static final Logger log = LoggerFactory.getLogger(FileStorageService.class);
@POST
@Path("/upload")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public ExStorageFileEntity upload(
@HeaderParam(HttpHeaders.AUTHORIZATION) String authorization, @PathParam("workspaceId") String workspaceId, @FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileData, @FormDataParam("metadata") ExStorageFileEntity metadata) {
String externalId = Long.toString(ExternalDocumentIDGenerator.getNextID());
String externalVersionId = Long.toString(ExternalDocumentVersionIDGenerator.getNextID());
Long fileSize = FileStorage.uploadFile(workspaceId, uploadedInputStream, fileData.getFileName(), externalId, externalVersionId);
metadata.setExternalId(externalId);
metadata.getVersion().setExternalId(externalVersionId);
metadata.getVersion().setSize(fileSize);
metadata = FileStorageResponseResourceWrapper.wrapWithResources(workspaceId, metadata);
return metadata;
}
@POST
@Path("/{externalId}/versions")
@Consumes(MediaType.MULTIPART_FORM_DATA)
@Produces(MediaType.APPLICATION_JSON)
public ExStorageFileEntity uploadVersion(
@HeaderParam(HttpHeaders.AUTHORIZATION) String authorization,
@PathParam("workspaceId") String workspaceId, @PathParam("externalId") String externalId, @FormDataParam("file") InputStream uploadedInputStream,
@FormDataParam("file") FormDataContentDisposition fileData, @FormDataParam("metadata") ExStorageFileEntity metadata) {
String externalVersionId = Long.toString(ExternalDocumentVersionIDGenerator.getNextID());
Long fileSize = FileStorage.uploadFile(workspaceId, uploadedInputStream, fileData.getFileName(), externalId, externalVersionId);
metadata.setExternalId(externalId);
metadata.getVersion().setExternalId(externalVersionId);
metadata.getVersion().setSize(fileSize);
Integer versionCount = metadata.getVersionCount();
if (versionCount == null) {
versionCount = 0;
}
versionCount = versionCount + 1;
metadata.setVersionCount(versionCount);
metadata = FileStorageResponseResourceWrapper.wrapWithResources(workspaceId, metadata);
return metadata;
}
@GET
@Path("/{externalId}/versions/{versionExternalId}/downloadBinary")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public InputStream download(
@HeaderParam(HttpHeaders.AUTHORIZATION) String authorization,
@PathParam("workspaceId") String workspaceId, @PathParam("externalId") String externalId, @PathParam("versionExternalId") String versionExternalId) {
InputStream inputStream = FileStorage.downloadFile(workspaceId, "", externalId, versionExternalId);
return inputStream;
}
@GET
@Path("/{externalId}/versions")
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public void getFileVersions(
@HeaderParam(HttpHeaders.AUTHORIZATION) String authorization,
@PathParam("workspaceId") String workspaceId, @PathParam("externalId") String externalId) {
}
@DELETE
@Path("/{externalId}/{versionExternalId}")
@Produces(MediaType.APPLICATION_JSON)
public ExStorageFileEntity deleteFile(
@HeaderParam(HttpHeaders.AUTHORIZATION) String authorization,
@PathParam("workspaceId") String workspaceId, @PathParam("externalId") String externalId, @PathParam("versionExternalId") String externalVersionId) {
FileStorage.deleteVersion(workspaceId, "", externalId, externalVersionId);
return createDummyMetadata(workspaceId, externalId, externalVersionId);
}
@DELETE
@Path("/{externalId}/versions/{versionExternalId}")
@Produces(MediaType.APPLICATION_JSON)
public ExStorageFileEntity deleteFileVersion(
@HeaderParam(HttpHeaders.AUTHORIZATION) String authorization,
@PathParam("workspaceId") String workspaceId, @PathParam("externalId") String externalId, @PathParam("versionExternalId") String externalVersionId) {
FileStorage.deleteVersion(workspaceId, "", externalId, externalVersionId);
return createDummyMetadata(workspaceId, externalId, externalVersionId);
}
@POST
@Path("/{externalId}/trash")
public ExStorageFileEntity trashFile(@HeaderParam(HttpHeaders.AUTHORIZATION) String authorization,
@PathParam("workspaceId") String workspaceId, @PathParam("externalId") String externalId, @QueryParam("versionExternalId") String externalVersionId) {
FileStorage.trashFile(workspaceId, "", externalId);
return createDummyMetadata(workspaceId, externalId, externalVersionId);
}
@POST
@Path("/{externalId}/untrash")
public ExStorageFileEntity untrashFile(@HeaderParam(HttpHeaders.AUTHORIZATION) String authorization,
@PathParam("workspaceId") String workspaceId, @PathParam("externalId") String externalId, @QueryParam("versionExternalId") String externalVersionId) {
FileStorage.unTrashFile(workspaceId, "", externalId);
return createDummyMetadata(workspaceId, externalId, externalVersionId);
}
@POST
@Path("/{externalId}/restoreVersion")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public ExStorageFileEntity restoreFileVersion(@HeaderParam(HttpHeaders.AUTHORIZATION) String authorization, @PathParam("workspaceId") String workspaceId, @PathParam("externalId") String externalId,
@QueryParam("versionExternalId") String versionExternalId, ExStorageFileEntity metadata) {
String restoreVersionId = metadata.getVersion().getExternalId();
String externalVersionId = Long.toString(ExternalDocumentVersionIDGenerator.getNextID());
InputStream inputStream = FileStorage.downloadFile(workspaceId, "", externalId, restoreVersionId);
Long fileSize = FileStorage.uploadFile(workspaceId, inputStream, metadata.getVersion().getFileName(), externalId, externalVersionId);
metadata.setExternalId(externalId);
metadata.getVersion().setExternalId(externalVersionId);
metadata.getVersion().setSize(fileSize);
Integer versionCount = metadata.getVersionCount();
if (versionCount == null) {
versionCount = 0;
}
versionCount = versionCount + 1;
metadata.setVersionCount(versionCount);
metadata = FileStorageResponseResourceWrapper.wrapWithResources(workspaceId, metadata);
return metadata;
}
private ExStorageFileEntity createDummyMetadata(String workspaceId, String externalId, String versionId) {
ExStorageFileVersionEntity version = new ExStorageFileVersionEntity();
version.setExternalId(versionId);
ExStorageFileEntity metadata = new ExStorageFileEntity();
metadata.setExternalId("UNKNOWN");
metadata.setVersion(version);
metadata.setId(-1L);
ExStorageUserEntity exStorageUserEntity = new ExStorageUserEntity();
exStorageUserEntity.setDisplayName("USER DISPLAY NAME NOT SUPPORTED");
metadata.setCreator(exStorageUserEntity);
return metadata;
}
}